// 这里的教程很精彩: https://developers.google.com/web/fundamentals/getting-started/primers/promises
// Promise的四(三)种状态
// fulfilled - The action relating to the promise succeeded
// rejected - The action relating to the promise failed
// pending - Hasn't fulfilled or rejected yet
// settled - Has fulfilled or rejected
//
function test(flag) {
  // Return a new promise.
  return new Promise(function(resolve, reject) {
	  if(flag)
		  resolve('fulfilled')
		else
		  reject('rejected')
  });
}

module.exports = test

// 失败要下面的写法才会有输出
// test(0).then(console.log, console.log)
// test(0).then(console.log).catch(console.log)

// then
// then返回的是是一个新的Promise实例
// then()可以链式调用, 后一个then的入参是前一个then的返回值


// 异常的捕捉, 使用catch
// 第二种写法要好于第一种写法，理由是第二种写法可以捕获前面所有then方法执行中的错误

// bad
promise
  .then(function(data) {
    // success
  }, function(err) {
    // error
  });

// good
promise
  .then(function(data) { //cb
    // success
  })
  .catch(function(err) {
    // error
  })
	.then(function(data){
	  // catch后面的then相当于finally
	})

// Promise对象抛出的错误不会传递到外层代码，即不会有任何反应。
// 注意，Chrome浏览器不遵守这条规定，它会抛出错误“ReferenceError: x is not defined”。

// Promise.resolve()在本轮“事件循环”结束时执行
// setTimeout(fn, 0)在下一轮“事件循环”开始时执行
setTimeout(function () {
  console.log('three');
}, 0);

Promise.resolve().then(function () {
  console.log('two');
});

console.log('one');

// one
// two
// three
